/***************************************************************
 * Name:      QtHelper
 * Purpose:   Code::Blocks plugin
 * Author:    Sviridov Michael Alexandrovich (2mihail@mail.ru)
 * Created:   2008-09-20
 * Copyright: Sviridov Michael Alexandrovich
 * License:   GPL
 **************************************************************/

#include <sdk.h>
#include "QtCfgDlg.h"
//-------------------------------------------------
BEGIN_EVENT_TABLE(QtCfgDlg, wxPanel)

	EVT_BUTTON(XRCID("ID_BUTTON_QTDIR"),QtCfgDlg::on_browse_qt_dir)
	EVT_BUTTON(XRCID("ID_BUTTON_QMAKESPEC"),QtCfgDlg::on_browse_mkspec)
	EVT_TEXT(XRCID("ID_TEXTCTRL_QMAKESPEC"), QtCfgDlg::on_read_mkspecs)

END_EVENT_TABLE()
//-------------------------------------------------
QtCfgDlg::QtCfgDlg(wxWindow* parent)
{
	wxXmlResource::Get()->LoadPanel(this, parent, _T("QtCfgDlg"));
	load();
}
//-------------------------------------------------
QtCfgDlg::~QtCfgDlg() {}
//-------------------------------------------------
void QtCfgDlg::save()
{
	ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("qt_helper"));
	cfg->Write(_T("/QTDIR"), qt_dir_edit()->GetValue());
	cfg->Write(_T("/MKSPECDIR"), mkspec_dir_edit()->GetValue());
	cfg->Write(_T("/MKSPEC"), mkspec_combo()->GetStringSelection());
}
//-------------------------------------------------
void QtCfgDlg::load()
{
	ConfigManager* cfg = Manager::Get()->GetConfigManager(_T("qt_helper"));
	qt_dir_edit()->SetValue(cfg->Read(_T("/QTDIR")));
	wxString mkspecs_dir = cfg->Read(_T("/MKSPECDIR"));
	mkspec_dir_edit()->SetValue(mkspecs_dir);
	Manager::Get()->GetMacrosManager()->ReplaceEnvVars(mkspecs_dir);
	init_mkspecs(mkspecs_dir);
	mkspec_combo()->SetStringSelection(cfg->Read(_T("/MKSPEC")));
}
//-------------------------------------------------
// getters for pointer to form widgets
wxTextCtrl* QtCfgDlg::qt_dir_edit()
{
	return XRCCTRL(*this, "ID_TEXTCTRL_QTDIR", wxTextCtrl);
}
//-----------------------------------------------------------
wxTextCtrl* QtCfgDlg::mkspec_dir_edit()
{
	return XRCCTRL(*this, "ID_TEXTCTRL_QMAKESPEC", wxTextCtrl);
}
//-----------------------------------------------------------
wxChoice* QtCfgDlg::mkspec_combo()
{
	return XRCCTRL(*this, "ID_CHOICE_MKSPEC", wxChoice);
}
//-----------------------------------------------------------
// handlers
void QtCfgDlg::on_browse_qt_dir(wxCommandEvent& event)
{
	wxString dir = qt_dir_edit()->GetValue();
	Manager::Get()->GetMacrosManager()->ReplaceEnvVars(dir);
	dir = ChooseDirectory(this,
							_T("Select your Qt installation directory"),
							dir,
							dir,
							false,
							true);

	if(!dir.IsEmpty())
		qt_dir_edit()->SetValue(dir);
}
//-------------------------------------------------
void QtCfgDlg::on_browse_mkspec(wxCommandEvent& event)
{
	wxString dir = mkspec_dir_edit()->GetValue();
	Manager::Get()->GetMacrosManager()->ReplaceEnvVars(dir);
	dir = ChooseDirectory(this,
							_T("Select your Qt mkspec directory (generally the mkspecs directory under your Qt installation directory)"),
							dir,
							dir,
							false,
							true);

	if(!dir.IsEmpty())
	{
		mkspec_dir_edit()->SetValue(dir);
		init_mkspecs(dir);
	}
}
//-------------------------------------------------
void QtCfgDlg::on_read_mkspecs(wxCommandEvent& event)
{
	wxString mkspec_dir = mkspec_dir_edit()->GetValue();
	Manager::Get()->GetMacrosManager()->ReplaceEnvVars(mkspec_dir);
	init_mkspecs(mkspec_dir);
}
//-------------------------------------------------
void QtCfgDlg::init_mkspecs(const wxString &mkspec_dir)
{
	if(!wxDir::Exists(mkspec_dir))
	{
		mkspec_combo()->Clear();
		return;
	}

	wxArrayString mkspecs;

	class MkSpecBrowser : public wxDirTraverser
	{
	public:
		MkSpecBrowser(wxArrayString& dirs) : mkspec_dirs(dirs) {}
		virtual wxDirTraverseResult OnFile(const wxString& WXUNUSED(filename))
		{
			return wxDIR_CONTINUE;
		}

		virtual wxDirTraverseResult OnDir(const wxString& dirname)
		{
			mkspec_dirs.Add(dirname);
			return wxDIR_CONTINUE;
		}

	private:
		wxArrayString& mkspec_dirs;
	};

	MkSpecBrowser browser(mkspecs);

	wxDir wx_mkspec_dir(mkspec_dir);
	wx_mkspec_dir.Traverse(browser);

	wxString cur_sel = mkspec_combo()->GetStringSelection();
	mkspec_combo()->Clear();
	for(unsigned i=0; i<mkspecs.GetCount(); i++)
	{
		if(wxFile::Exists(mkspecs[i] + _T("/qmake.conf")))
		{
			wxString str = mkspecs[i].Remove(0, mkspec_dir.Length() + 1);
			mkspec_combo()->Append(str);
		}
	}
	if(cur_sel.IsEmpty())
		mkspec_combo()->SetStringSelection(_T("default"));
	else if(!mkspec_combo()->SetStringSelection(cur_sel))
		mkspec_combo()->SetStringSelection(_T("default"));
}
//-------------------------------------------------
